// 爬取网页表情包
const axios = require('axios'); //请求模块
const cheerio = require('cheerio'); // 爬取网页源码模块
// 引入文件模块
const fs = require('fs');
// 文件后缀模块
const path = require('path');


// 保存网页地址
let httpUrl = 'https://www.doutupk.com/article/list/?page=1';

// 将延迟函数封装成promise对象
function lcWait(milliSecondes) {
    return new Promise((reslove , reject)=>{
        setTimeout(()=>{
            reslove(`成功执行延迟函数，延迟：${milliSecondes}`)
        } , milliSecondes)
    })
}



// 定义一个获取页面总数的函数
async function getNum() {
    // 获取页面源码
    let res = await axios.get(httpUrl);
    // 把页面源码导入获取爬取对象
    let $ = cheerio.load(res.data);
    // 获取页面总数的li
    let btnLength = $('.pagination li').length
    // 拿到页面总数
    let allNum = $('.pagination li').eq(btnLength - 2).find('a').text()
    // 返回总数
    return allNum
}

// 调用就会循环爬取
async function spider() {
    // 获取所有页面
    let allPageNum = await getNum();
    for (let i = 1; i <=allPageNum; i++){
        // 延迟
        await lcWait(3000 * i);
        getListPage(i);
    }

}

// 定义一个函数，向需要爬取的页面发送请求
async function getListPage(pageNum) {
    let httpUrl = `https://www.doutupk.com/article/list/?page=${pageNum}`;
    let res = await axios.get(httpUrl);
    // res.data 返回的是url的页面源码
    // 把页面源码导入获取爬取对象
    let $ = cheerio.load(res.data);
    // each()相当于遍历，i是索引值，element是遍历拿到的元素
    $('#home .col-sm-9 >a').each(async (i,element)=>{
        // attr('href') 这个可以获取到当前元素的指定属性
        let pageUrl = $(element).attr('href'); // 拿到表情包详情页URL
        
        // 获取表情包标题
        let imgTitle = $(element).find('.random_title').text();
        // 设置正则匹配过滤
        let reg = /(.*?)\d/igs ;
        imgTitle = reg.exec(imgTitle)[1];

        // 创建目录，以表情包标题为目录名
        fs.mkdir('./img/' + imgTitle , (err)=>{
            if (err) {
                console.log(err);
            } else {
                console.log('创建目录成功：' + './img/' + imgTitle);
            }
        });
        // 延迟
        await lcWait(50 * i);

        // 调用当前url表情包页面的函数
        parsePage(pageUrl , imgTitle);
    })
}


// 定义一个用来获取当前url表情包页面的函数
const parsePage = async (url , imgTitle)=>{
    // 发送请求，获取详情页源码
    let res = await axios.get(url);
    // 获取爬取对象
    let $ = cheerio.load(res.data);
    // 遍历拿到的img
    $('.pic-content img').each((i,element)=>{
        // 获取所有img元素的src属性
        let imgUrl = $(element).attr('src');

        // 拿到请求回来的图片后缀
        let extName = path.extname(imgUrl);
        
        // 图片路径和图片名字
        let imgPath = `./img/${imgTitle}/${i}${extName}`;
        // 创建写入流, 
        let wsStream = fs.createWriteStream(imgPath);
        axios.get(imgUrl , {responseType:'stream'}).then((res)=>{
            // 我们设置了请求得到的是流文件，我们利用 pipe管道函数 放入我们写入流
            res.data.pipe(wsStream);
            // 加载提示
            console.log('图片加载完成：' + imgPath);
            // 监听一个事件，确保导入完成之后关闭流写入
            res.data.on('close' , ()=>{
                // 关闭流写入
                wsStream.close();
            })
        });
    
    })
}


spider()